package com.ss.android.auto.launch.tasks.collector.stage1

import com.dcd.abtest.experiment.launch.HomePageLaunchTaskOptExperiment
import com.ss.android.auto.anr.ISliverServices
import com.ss.android.auto.config.settings.SearchSettingsIndex
import com.ss.android.auto.launch.HeaderTask
import com.ss.android.auto.launch.tasks.collector.MainThreadTaskCollector
import com.ss.android.auto.launch.tasks.old.NewUserLaunchTask.isNewUserPreload
import com.ss.android.auto.log.AutoLog
import com.ss.android.auto.optimize.serviceapi.IOptimizeService
import com.ss.android.auto.servicemanagerwrapper.AutoServiceManager
import com.ss.android.auto.taskpoint.api.ITaskPointService
import com.ss.android.auto.utils.NewUserUtils
import com.ss.android.common.app.AbsApplication
import com.ss.android.image.FrescoUtils
import com.ss.android.util.FlagUtil

/**
 * 第一阶段主线程任务，按顺序执行。
 * Warning！！这里面新增的都会增加启动耗时，请确认是否可以异步执行。
 *
 *  @author zhongxinyuan @ ByteDance Inc
 *  @since   2022/10/20
 */
object Stage1SyncTasks : MainThreadTaskCollector() {

    override fun collectSubTasks() {
        addSubTask("initAutoCrash") {
            HeaderTask.initAutoCrash()
        }
        addSubTask("setAppTrack") {
            HeaderTask.setAppTrack() //打包相关上报
        }
        addSubTask("injectDepend") {
            HeaderTask.injectDepend() // 友盟注册相关
        }
        addSubTask("initThreadPlus") {
            HeaderTask.initThreadPlus() // ThreadPlus线程池设置
        }
        addSubTask("initAccountManager") {
            HeaderTask.initAccountManager() // 系统帐号设置
        }
        addSubTask("initGson") {
            HeaderTask.initGson() // Gson 初始化
        }
        addSubTask("preloadSplashAdView") {
            HeaderTask.mAdvanceInitSplashAd = false
            val enablePreloadSplashAdAfterFresco =
                SearchSettingsIndex.ins(AbsApplication.getApplication()).enablePreloadSplashAdAfterFresco.value
            if (SearchSettingsIndex.ins(AbsApplication.getApplication()).mAdvanceInitSplashAd.value && !enablePreloadSplashAdAfterFresco) {
                HeaderTask.mAdvanceInitSplashAd = true
                HeaderTask.preloadSplashAdView() // 预加载广告资源
            }
            if (!HeaderTask.mAdvanceInitSplashAd && !enablePreloadSplashAdAfterFresco) {
                HeaderTask.preloadSplashAdView() // 预加载广告资源
            }
        }
        addSubTask("initBaseAppData") {
            //BaseAppData -> AppLog -> TTNet -> AppConfig 初始化顺序不能更改
            HeaderTask.initBaseAppData() // AppData初始化
        }
        addSubTask("initAppLog") {
            HeaderTask.initAppLog() // AppLog 初始化
        }
        //帐号初始化
        addSubTask("initAccount") {
            HeaderTask.initAccount()
        }
        addSubTask("initTTNet") {
            HeaderTask.initTTNet() // TTNet 初始化
            // 新用户预加载开启时，netFetcher需要在TTNet初始化后重新赋值
            if (NewUserUtils.isNewUser() && isNewUserPreload()) {
                FrescoUtils.changeFetcher()
            }
            // AppConfig 初始化
            HeaderTask.initAppConfig()
        }
        addSubTask("updateFlagStatus") {
            //个性化推荐开关状态读取
            FlagUtil.updateMemoryFlag(AbsApplication.getApplication())
        }
        if (!HomePageLaunchTaskOptExperiment.open()) {
            addSubTask("fetchMctSwitchStatus") {
                AutoLog.d("mct_entrance_tag", "runTask: ")
                HeaderTask.fetchMctSwitchStatus() // 请求卖车通用户跳转小程序开关
            }
        }
        addSubTask("initSpManager") {
            HeaderTask.initSpManager() // SharePreference 初始化
        }
        addSubTask("initQualityStat") {
            HeaderTask.initQualityStat() // 品质平台sdk初始化
        }
        addSubTask("initAdTracker") {
            HeaderTask.initAdTracker() // 广告监测SDK
        }
        addSubTask("initALog") {
            HeaderTask.initALog() // ALog 初始化
        }
        addSubTask("initRxErrorHandler") {
            HeaderTask.initRxErrorHandler() // 注册RxJava ErrorHandler
        }

        addSubTask("initYZSDK") {
            HeaderTask.initYzSdk()
        }
        addSubTask("getPreInstallChannel") {
            HeaderTask.getChannelPath()
        }

        addSubTask("initAppHook") {
            HeaderTask.initAppHook() // AppHook 初始化
        }
        addSubTask("initFrescoListener") {
            HeaderTask.initFrescoListener() // 注册 Fresco 埋点回调接口
        }
        addSubTask("initSpipeData") {
            HeaderTask.initSpipeData() // 用户帐号  初始化
        }
        addSubTask("initMetaSecSdk") {
            // 依赖SpipeData，依赖applog
            HeaderTask.initMetaSecSdk() // 反作弊sdk
        }
        addSubTask("initTTPreload") {
            HeaderTask.initTTPreload() // TTPreload 初始化
        }
        addSubTask("initAppLogAccount") {
            HeaderTask.initAppLogAccount() // AppLog 设置帐号信息
        }
        addSubTask("initWebViewRelated") {
            HeaderTask.initWebViewRelated() // WebView相关设置：JsBridge、context等
        }
        addSubTask("initPushRelated") {
            HeaderTask.initPushRelated() // Push 相关初始化
        }
        addSubTask("initSettingObserver") {
            HeaderTask.initSettingObserver() // Setting 回调初始化
        }
        addSubTask("initTecOptimize") {
            HeaderTask.initTecOptimize()
        }

        addSubTask("initLottie") {
            HeaderTask.initLottie()
        }
        addSubTask("initSimpleAdapterDebugInfo") {
            HeaderTask.initSimpleAdapterDebugInfo()
        }
        addSubTask("reportFirstComponent") {
            HeaderTask.reportFirstComponent() // 上报获取FirstComponent结果
        }
        addSubTask("ISliverServices") {
            // Sliver初始化  ANR、NativeCrash trace上报
            AutoServiceManager.getService2<ISliverServices>(ISliverServices::class.java)
                ?.init(AbsApplication.getApplication())
        }
        addSubTask("startFpsDetector") {
            AutoServiceManager.getService2<IOptimizeService>(IOptimizeService::class.java)
                ?.startFpsDetector(AbsApplication.getApplication())
        }
        addSubTask("TaskPointService") {
            AutoServiceManager.getService2(ITaskPointService::class.java)?.setup(AbsApplication.getApplication())
        }
        if (!HomePageLaunchTaskOptExperiment.open()) {
            addSubTask("initWidget") {
                HeaderTask.initWidget()
            }
        }
        addSubTask("initRxSupportNetPredicate") {
            HeaderTask.initRxSupportNetPredicate()
        }
        addSubTask("initLivePlayer") {
            HeaderTask.initLivePlayer()
        }
        addSubTask("initMallSaas") {
            HeaderTask.initMallSaas()
        }
    }
}